#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>

#define High 20
#define Width 30


int moveDirection;
int canvas[High][Width]={0};
int food_x,food_y;

void HideCursor()//ÓÃÓÚÒþ²Ø¹â±ê
{
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void gotoxy(int x,int y)
{
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}
void startup()
{
   int i,j;
   for(i=0;i<High;i++)
   {
       canvas[i][0]=-1;
       canvas[i][Width-1]=-1;
   }
   for(j=0;j<Width;j++)
   {
       canvas[0][j]=-1;
       canvas[High-1][j]=-1;
   }

   canvas[High/2][Width/2]=1;
   for(i=0;i<4;i++)
   canvas[High/2][Width/2-i]=i+1;
   moveDirection=4;
   food_x=rand()%(High-5)+2;
   food_y=rand()%(Width-5)+2;
   canvas[food_x][food_y]=-2;
   HideCursor();
}

void moveSnakeByDirection()
{
    int i,j;
    int max=0;
    int oldtail_i,oldtail_j;
    int oldhead_i,oldhead_j;
    for(i=1;i<High-1;i++)
    {
        for(j=1;j<Width-1;j++)
        {
            if(canvas[i][j]>0)
            {
                canvas[i][j]++;
                if(max<canvas[i][j])
                {
                    max=canvas[i][j];
                    oldtail_i=i;
                    oldtail_j=j;
                }
                if(canvas[i][j]==2)
                {
                    oldhead_i=i;
                    oldhead_j=j;
                }
            }
        }
    }
    int newhead_i,newhead_j;
    if(moveDirection==1)//上
    {
        newhead_i=oldhead_i-1;
        newhead_j=oldhead_j;
    }
    if(moveDirection==2)//下
    {
        newhead_i=oldhead_i+1;
        newhead_j=oldhead_j;
    }
    if(moveDirection==3)//左
    {
       newhead_i=oldhead_i;
       newhead_j=oldhead_j-1;
    }
    if(moveDirection==4)//右
    {
       newhead_i=oldhead_i;
       newhead_j=oldhead_j+1;
    }
    if(canvas[newhead_i][newhead_j]==-2)
    {
        canvas[food_x][food_y]=0;
        food_x=rand()%(High-5)+2;
        food_y=rand()%(Width-5)+2;
        canvas[food_x][food_y]=-2;
    }
    else
        canvas[oldtail_i][oldtail_j]=0;
    if(canvas[newhead_i][newhead_j]>0||canvas[newhead_i][newhead_j]==-1)
    {
        printf("GameOver\n");
        Sleep(2000);
        system("pause");
        exit(0);
    }
    else
        canvas[newhead_i][newhead_j]=1;
}

void show()
{
   gotoxy(0,0);
   int i,j;
   for(i=0;i<High;i++)
   {
       for(j=0;j<Width;j++)
       {
           if(canvas[i][j]==-1)
           printf("#");
           else if(canvas[i][j]==0)
            printf(" ");
           else if(canvas[i][j]==1)
            printf("@");
           else if(canvas[i][j]>1)
            printf("*");
           else if(canvas[i][j]==-2)
            printf("o");
       }
       printf("\n");
   }
   Sleep(100);
}
void updateWithoutInput()
{
   moveSnakeByDirection();
}
void updateWithInput()
{
   char input;
   if(kbhit())
   {
       input=getch();
       if(input=='a')
       {
           moveDirection=3;
           moveSnakeByDirection();
       }
       else if(input=='s')
       {
           moveDirection=2;
           moveSnakeByDirection();
       }
       else if(input=='d')
       {
           moveDirection=4;
           moveSnakeByDirection();
       }
       else if(input=='w')
       {
           moveDirection=1;
           moveSnakeByDirection();
       }
   }
}
int main()
{
	startup();
	while(1)
	{
		show();
		updateWithInput();
		updateWithoutInput();
	}
	return 0;
}

